package com.spring.demo3.eg2;

import org.springframework.objenesis.ObjenesisStd;

/**
 * @author vhans
 */
public class Test {
    /**
     * 当第1次调用say方法的时候，会被cglib拦截，进入lazyLoader的loadObject内部，将这个方法的返回值
     * 作为say方法的调用者，loadObject中返回了一个 Vhans 的User，cglib内部会将loadObject
     * 方法的返回值和say方法关联起来，然后缓存起来，而第2次调用say方法的时候，通过方法名去缓存中
     * 找，会直接拿到第1次返回的UserModel，所以第2次不会进入到loadObject方法中了
     */
    @org.junit.Test
    public void test() {
        User proxy = UserLazyLoader.createProxy(new User());
        System.out.println("第一次调用代理的say方法");
        proxy.say();
        System.out.println("第二次调用代理的say方法");
        proxy.say();
    }

    /**
     * 实现博客内容的懒加载
     */
    @org.junit.Test
    public void test1() {
        Blog blog = new Blog();
        System.out.println(blog.getTitle());
        System.out.println("--获取1--");
        BlogContent blogContent1 = blog.getBlogContent();
        System.out.println(blogContent1);
        System.out.println(blogContent1.getContent());
        System.out.println("--获取2--");
        BlogContent blogContent2 = blog.getBlogContent();
        System.out.println(blogContent2);
        System.out.println(blogContent2.getContent());
    }

    // Objenesis：实例化对象的一种方式，它不使用构造方法创建Java对象
    @org.junit.Test
    public void test5() {
        ObjenesisStd objenesisStd = new ObjenesisStd();
        User user = objenesisStd.newInstance(User.class);
        System.out.println(user);
    }

}
